/*
 * Copyright 2010 Michael Nitsche
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package de.mnit.schnipsel.swt.dialog.konfig;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;

import de.mnit.basis.daten.konstant.position.POSITION_V;
import de.mnit.basis.fehler.system.F_Sys_InOut;
import de.mnit.basis.fehler.system.F_Sys_Sicherheit;
import de.mnit.basis.swt.anw.A_MN_Gruppe;
import de.mnit.basis.swt.dialog.SWT_Dialog;
import de.mnit.basis.swt.dialog.SWT_Fehler;
import de.mnit.basis.swt.element.S_SWT_Komponente;
import de.mnit.basis.swt.element.steuer.SWT_Knopf;
import de.mnit.basis.swt.element.steuer.SWT_Label;
import de.mnit.basis.swt.element.steuer.rollbar.SWT_TextEingabe;
import de.mnit.basis.swt.element.steuer.rollbar.gruppe.SWT_Auswahl;
import de.mnit.basis.swt.element.steuer.rollbar.gruppe.bild.deko.SWT_Fenster;
import de.mnit.basis.swt.element.steuer.rollbar.gruppe.bild.deko.S_Fenster;
import de.mnit.basis.swt.grafik.icon.direkt.ICON;
import de.mnit.basis.swt.layout.LayoutGitter;
import de.mnit.basis.swt.layout.LayoutLeer;
import de.mnit.basis.sys.sprache.S;
import de.mnit.schnipsel.db.CRYPTLEVEL;
import de.mnit.schnipsel.db.DBManager;
import de.mnit.schnipsel.zentral.SC_Crypt;

/**
 * @author Michael Nitsche
 * 05.07.2010	Erstellt
 */
public class K_KonfigCrypt extends A_MN_Gruppe<K_KonfigCrypt> implements S_KonfigSeite<K_KonfigCrypt> {

	public static void main(String[] args)   { start(K_KonfigCrypt.class, 450, 400); }


	private static final S s=new S(K_KonfigCrypt.class);
	private static final String DUMMY="12345678";
	private static final String std_text1=s.t("Unverschlüsselt");
	private static final String std_text2=s.t("Inhalt verschlüsselt");
	private final SWT_Auswahl		k_standard	= new SWT_Auswahl().s1_NurLesbar();
	private final SWT_TextEingabe	k_pass		= new SWT_TextEingabe();
	private final SWT_TextEingabe	k_pass2		= new SWT_TextEingabe();
	private final SWT_Label			k_text_std	= new SWT_Label();
	private final SWT_Label			k_text_pass	= new SWT_Label();
	private final SWT_Label			k_text_pass2= new SWT_Label();
	private final SWT_Knopf			k_alle		= new SWT_Knopf();


	// ERSTELLEN

	public boolean oeffnen() {
		if(!SC_Crypt.i().gEingerichtet())
			return true;

		byte[] pass=SC_Crypt.i().gDBPass();
		if(pass==null)
			SWT_Dialog.hinweis(s.t("Das eingegebene Passwort ist falsch!"));
		return pass!=null;
	}

	public boolean speichern() {
		DBManager.konfig().sCryptLevel(iLevelAuswahl());
		String pass=t.k_pass.gText();

		if(pass.length()!=0 && !pass.equals(DUMMY)) {
			if(!pass.equals(t.k_pass2.gText())) {
				SWT_Fehler.neu(s.t("Die eingegebenen Passwörter stimmen nicht überein!"), false);
				return false;
			}
			if(pass.length()<6) {
				SWT_Fehler.neu(s.t("Das Passwort ist zu kurz!"), false);
				return false;
			}
			DBManager.konfig().passSetzen(pass.getBytes());
			SC_Crypt.i().sPass(pass);
		}

//		iVerschluesseln();
		return true;
	}

	protected S_SWT_Komponente<?, ? extends Composite> layout() {
		LayoutGitter haupt = LayoutGitter.neu()
			.sSpaltenAnzahl(3)
			.sAussenabstand(5)
			.sKomponente(t.k_text_std)
				.sBreite(100)
				.sPositionV(POSITION_V.MITTE)
				.fertig()
			.sKomponente(t.k_standard)
				.sFlexibelH()
				.fertig()
			.sKomponente(t.k_alle)
				.sPositionV(POSITION_V.MITTE)
				.sBreite(100)
				.fertig()

			.sKomponente(LayoutLeer.neu())
				.sHoehe(10)
				.sUebergreifendH(3)
				.fertig()

			.sKomponente(t.k_text_pass)
				.sBreite(100)
				.sPositionV(POSITION_V.MITTE)
				.fertig()
			.sKomponente(t.k_pass)
				.sUebergreifendH(2)
				.sFlexibelH()
				.fertig()

			.sKomponente(t.k_text_pass2)
				.sBreite(100)
				.sPositionV(POSITION_V.MITTE)
				.fertig()
			.sKomponente(t.k_pass2)
				.sUebergreifendH(2)
				.sFlexibelH()
				.fertig()
			;
		return haupt;
	}

	protected void initStyle() {
		t.k_text_pass.sText(s.t("Passwort:"));
		t.k_text_pass2.sText(s.t("Wiederholen:"));
		t.k_text_std.sText(s.t("Standard:"));

		t.k_pass.sVerdeckt();
		t.k_pass2.sVerdeckt();

		if(SC_Crypt.i().gEingerichtet()) {
			t.k_pass.sText(DUMMY);
			t.k_pass2.sText(DUMMY);
		}

		t.k_standard.plus(std_text1);
		t.k_standard.plus(std_text2);
		t.k_alle.sText(s.t("Alle ändern"));

		// Daten laden
		CRYPTLEVEL cryptlvl=DBManager.konfig().gCryptLevel();
		t.k_standard.sText(cryptlvl==CRYPTLEVEL.OFFEN ? std_text1 : std_text2);

//		t.k_host.sFokus();
	}

	protected void initEvents() {
		t.k_alle.eAuswahl(new Listener() {
			public void handleEvent(Event e) {
				iVerschluesseln();
			}
		});

		//Unsinn, aber Tab geht sonst nicht!
		t.k_pass.eTaste(new KeyListener() {
			public void keyPressed(KeyEvent e) {}
			public void keyReleased(KeyEvent e) {
				if(e.keyCode==SWT.TAB)
					t.k_text_pass2.swt().setFocus();
			}
		});
	}

	protected S_Fenster<?> fenster(A_MN_Gruppe<?> instanz) throws F_Sys_InOut {
		return SWT_Fenster.neu(instanz, false, 400, 150, s.t("Verschlüsselung"),
			ICON._16.WERKZEUG, ICON._24.WERKZEUG, ICON._32.WERKZEUG);
	}

	private CRYPTLEVEL iLevelAuswahl() {
		String text=t.k_standard.gText();
		if(text.equals(std_text1))
			return CRYPTLEVEL.OFFEN;
		return CRYPTLEVEL.INHALT;
	}

	private void iVerschluesseln() {
		CRYPTLEVEL level=iLevelAuswahl();
		try {
			DBManager.schnipsel().verschluesseln(level);
		} catch(F_Sys_Sicherheit e1) {
			SWT_Fehler.neu(s.t("Passwort konnte nicht geändert werden!"), false);
		}
	}

}
